package com.example.day4.asynchronous;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.concurrent.CompletableFuture;

/**
 * CompletableFuture
 */
public class C03CompletableFutureTest {
    static Logger logger = LoggerFactory.getLogger("Test");

    public static void main(String[] args) throws IOException {
        // 1.异步执行任务
        // CompletableFuture有两个常用的方法
        // CompletableFuture.runAsync() 该方法用于在任务不需要返回结果的时候使用
        // CompletableFuture.supplyAsync() 该方法用于在任务需要返回结果时使用

        // 注意:CompletableFuture中的线程都是守护线程,如果主线程没有代码结束了守护线程就会结束因此CompletableFuture中的代码就不会被执行
        CompletableFuture.runAsync(() -> logger.info("异步处理1"));
        CompletableFuture.supplyAsync(() -> {
            logger.info("异步处理2");
            return "ok";
        }).thenApply(x -> x + "拼接后").thenAccept(x -> logger.info(x));

        // 不让主线程立刻结束
        System.in.read();

        // 2.处理异步任务的结果
        /*
            thenApply           转换结果
            thenApplyAsync      异步转换结果
            thenAccept          消费结果
            thenAcceptAsync     异步消费结果
         */
    }
}
